iT邦幫忙

2022 iThome 鐵人賽

DAY 22
0
Mobile Development

從開發瀏覽器 APP 學習 Android 實戰技巧,並搭上 Jetpack Compose 的列車系列 第 23

[Day22] 從開發瀏覽器 APP 學習實戰技巧 -- 遠端編譯程式碼

  • 分享至 

  • xImage
  •  

經過一連串燒腦的利用 Compose 改寫介面後,來點不一樣的主題,轉換一下心情。

Apple 新的 M1 CPU 系列出來後,這一兩年有買 Mac 電腦的人不禁覺得苦惱。想要一嘗 M1 的強大性能,卻又苦於已經擁有了一台不算慢的 Mac 電腦,現在想轉賣又不見得能賣到什麼好價錢。一個折衷的方案是:買台最便宜的 M1 設備 Mac mini,然後讓原本的 Mac 電腦能呼叫這台 Mac mini 幫忙執行很花 CPU 的工作,像是編譯程式!如此一來,平常使用很順手的電腦就可以在另一台電腦辛苦的編譯程式時,還能照常地上網刷 FB 或是看 Youtube 影片。

mainframer

為了要實現這想法,首先要來介紹一下一個好用的工具:mainframer

mainframer Github 上寫得很清楚,這個工具可以協助你在遠端上執行指令,同時把執行後的結果再同步回電腦。

A tool that executes a command on a remote machine while syncing files back and forth. The process is known as remote execution (in general) and remote build (in particular cases).

在 Github 上,預設的分支是 3.x,但 3.x 的版本是有問題的(至少我試不出來,有人試成功的話,請留言告知,感謝),要先切到 2.x 的分支。

mainframer 的概念

在本地端執行指令 ➊ 後,mainframer 會私底下幫忙執行 ➋ ➌ ➍ ➎。

https://ithelp.ithome.com.tw/upload/images/20221002/20140260OzYsxTyMKq.png

mainframer 設定

README 中有說明怎麼設定,我這邊快速講一下。

舊的 Intel Mac 設定

  • 有三個變數先定義如下:
REMOTE_MACHINE_ALIAS — 遠端 M1 Mac mini 的 SSH alias (我就取名為 m1)
REMOTE_MACHINE_IP_OR_HOSTNAME — 遠端 M1 Mac mini 的 IP
REMOTE_MACHINE_USERNAME — M1 Mac mini 上的使用者名稱
  • 確認已經安裝了 ssh 和 rsync。

  • 產生使用者的 SSH key
    ssh-keygen -t rsa -b 4096 -C "{REMOTE_MACHINE_USERNAME}"

  • 把下面設定加到 ~/.ssh/config

Host {REMOTE_MACHINE_ALIAS}
  User {REMOTE_MACHINE_USERNAME}
  HostName {REMOTE_MACHINE_IP_OR_HOSTNAME}
  Port 22
  IdentityFile ~/.ssh/id_rsa
  PreferredAuthentications publickey
  ControlMaster auto
  ControlPath /tmp/%r@%h:%p
  ControlPersist 1h

以我自己的例子來說,會是長成下面這樣:

Host m1
  User danielkao
  HostName 192.168.1.145
  Port 22
  IdentityFile ~/.ssh/id_rsa
  PreferredAuthentications publickey
  ControlMaster auto
  ControlPath /tmp/%r@%h:%p
  ControlPersist 1h
  • 利用下面指令複製 SSH Key,下面遠端的部分會用到。
$ pbcopy < ~/.ssh/id_rsa.pub

.mainframer/ 目錄設定

最新版的 mainframer script 複製到 Android 專案的根目錄中。

  • 在專案中建立 .mainframer 目錄,並建立 config 檔案,填入以下資訊:

remote_machine={REMOTE_MACHINE_ALIAS}

以我的例子來說,會是:

remote_machine=m1
  • 設定 .mainframer/ignore
    一堆跟編譯無關的檔案,都不需要同步到 m1 去。
.gradle
.git/*
.gitmodules
/.idea
/local.properties
/.mainframer

其他設定

官方文件其實還有許多細步的設定可以調整。這些額外的選項可以在整個流程都通了之後,再斟酙修改。

buildfoundation/mainframer

遠端 (M1 Mac mini)

  • 先確認已經安裝了 SSH Server 和 rsync。
  • 設定 user 的 SSH key (從剛剛 intel Mac 上 copy 來的值)
$ mkdir -p ~/.ssh
$ chmod u+rwx,go= ~/.ssh
$ echo {SSH_KEY} >> ~/.ssh/authorized_keys
$ chmod u+rw,go= ~/.ssh
  • 安裝編譯程式所需的其他軟體。

以開發 Android 來說,我有在 M1 Mac mini 中安裝了最新版的 Android Studio,先確認過 Android projects 可以正常在 M1 Mac mini 中編譯。

執行

一切設定好之後,進到 Mac 的 Android 專案下,可以來執行 mainframer 了!

sh mainframer.sh ./gradlew clean assembleRelease

如果你的 Android 專案原本在 Mac 中的編譯時間需要到一兩分鐘或更久的話,透過遠端的 M1 機器執行,再同步 binary 回本機,將會感受到差異。

後話

如果嫌打指令太麻煩的話,可以在 Android Studio 中建立 External Tools,並且加到工具列上頭,這樣子就可以點一下讓遠端的 M1 為你編譯程式了。

相關連結


上一篇
[Day21-2] 從開發瀏覽器 APP 學習實戰技巧 -- 改寫工具列 III:改寫後
下一篇
[Day23] 從開發瀏覽器 APP 學習 Android 實戰技巧 -- 多指手勢操作 I
系列文
從開發瀏覽器 APP 學習 Android 實戰技巧,並搭上 Jetpack Compose 的列車31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言